home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 14 / CU Amiga Magazine's Super CD-ROM 14 (1997)(EMAP Images)(GB)(Track 1 of 3)[!][issue 1997-09].iso / CUCD / Programming / Mesa-2.2 / src-aux / xxform.c < prev   
Encoding:
C/C++ Source or Header  |  1996-03-05  |  2.3 KB  |  130 lines

  1. /* xform.c */
  2.  
  3. #include <math.h>
  4. #include <stdio.h>
  5. #include <GL/gl.h>
  6. #include "3d.h"
  7.  
  8.  
  9.  
  10. #define STACKDEPTH 10
  11.  
  12. typedef struct {
  13.     GLdouble    mat[4][4];
  14.     GLdouble    norm[3][3];
  15. } mat_t;
  16.  
  17. static mat_t matstack[STACKDEPTH] = {
  18.     {{{1.0, 0.0, 0.0, 0.0},
  19.     {0.0, 1.0, 0.0, 0.0},
  20.     {0.0, 0.0, 1.0, 0.0},
  21.     {0.0, 0.0, 0.0, 1.0}},
  22.     {{1.0, 0.0, 0.0},
  23.     {0.0, 1.0, 0.0},
  24.     {0.0, 0.0, 1.0}}}
  25. };
  26. static int identitymat = 1;
  27.  
  28. static int mattop = 0;
  29.  
  30. void m_xformpt(GLdouble pin[3], GLdouble pout[3], 
  31.     GLdouble nin[3], GLdouble nout[3])
  32. {
  33.     int    i;
  34.     GLdouble    ptemp[3], ntemp[3];
  35.     mat_t    *m = &matstack[mattop];
  36.  
  37.     if (identitymat) {
  38.     for (i = 0; i < 3; i++) {
  39.         pout[i] = pin[i];
  40.         nout[i] = nin[i];
  41.     }
  42.     return;
  43.     }
  44.     for (i = 0; i < 3; i++) {
  45.     ptemp[i] = pin[0]*m->mat[0][i] +
  46.            pin[1]*m->mat[1][i] +
  47.            pin[2]*m->mat[2][i] +
  48.            m->mat[3][i];
  49.     ntemp[i] = nin[0]*m->norm[0][i] +
  50.            nin[1]*m->norm[1][i] +
  51.            nin[2]*m->norm[2][i];
  52.     }
  53.     for (i = 0; i < 3; i++) {
  54.     pout[i] = ptemp[i];
  55.     nout[i] = ntemp[i];
  56.     }
  57.     normalize(nout);
  58. }
  59.  
  60. void m_xformptonly(GLdouble pin[3], GLdouble pout[3])
  61. {
  62.     int    i;
  63.     GLdouble    ptemp[3];
  64.     mat_t    *m = &matstack[mattop];
  65.  
  66.     if (identitymat) {
  67.     for (i = 0; i < 3; i++) {
  68.         pout[i] = pin[i];
  69.     }
  70.     return;
  71.     }
  72.      for (i = 0; i < 3; i++) {
  73.     ptemp[i] = pin[0]*m->mat[0][i] +
  74.            pin[1]*m->mat[1][i] +
  75.            pin[2]*m->mat[2][i] +
  76.            m->mat[3][i];
  77.     }
  78.     for (i = 0; i < 3; i++) {
  79.     pout[i] = ptemp[i];
  80.     }
  81. }
  82.  
  83. void m_pushmatrix(void)
  84. {
  85.     if (mattop < STACKDEPTH-1) {
  86.     matstack[mattop+1] = matstack[mattop];
  87.     mattop++;
  88.     } else
  89.     error("m_pushmatrix: stack overflow\n");
  90. }
  91.  
  92. void m_popmatrix(void)
  93. {
  94.     if (mattop > 0)
  95.     mattop--;
  96.     else
  97.     error("m_popmatrix: stack underflow\n");
  98. }
  99.  
  100. void m_translate(GLdouble x, GLdouble y, GLdouble z)
  101. {
  102.     int    i;
  103.     mat_t    *m = &matstack[mattop];
  104.  
  105.     identitymat = 0;
  106.     for (i = 0; i < 4; i++)
  107.     m->mat[3][i] = x*m->mat[0][i] +
  108.                  y*m->mat[1][i] +
  109.                  z*m->mat[2][i] +
  110.                  m->mat[3][i];
  111. }
  112.  
  113. void m_scale(GLdouble x, GLdouble y, GLdouble z)
  114. {
  115.     int    i;
  116.     mat_t    *m = &matstack[mattop];
  117.  
  118.     identitymat = 0;
  119.     for (i = 0; i < 3; i++) {
  120.     m->mat[0][i] *= x;
  121.     m->mat[1][i] *= y;
  122.     m->mat[2][i] *= z;
  123.     }
  124.     for (i = 0; i < 3; i++) {
  125.     m->norm[0][i] /= x;
  126.     m->norm[1][i] /= y;
  127.     m->norm[2][i] /= z;
  128.     }
  129. }
  130.